package database

import (
	"gorm.io/gorm"
)

// RecursivePreload 递归预加载分类的子分类
// 这个函数可以用于无限级分类的预加载
func RecursivePreload(db *gorm.DB, categories *[]Category) error {
	// 如果没有分类，直接返回
	if len(*categories) == 0 {
		return nil
	}

	// 遍历所有分类
	for i := range *categories {
		// 递归预加载子分类
		if err := recursivePreloadChildren(db, &(*categories)[i]); err != nil {
			return err
		}
	}

	return nil
}

// recursivePreloadChildren 递归预加载单个分类的子分类
func recursivePreloadChildren(db *gorm.DB, category *Category) error {
	// 预加载直接子分类
	if err := db.Model(category).Association("Children").Find(&category.Children); err != nil {
		return err
	}

	// 如果没有子分类，直接返回
	if len(category.Children) == 0 {
		return nil
	}

	// 递归预加载每个子分类的子分类
	for i := range category.Children {
		if err := recursivePreloadChildren(db, &category.Children[i]); err != nil {
			return err
		}
	}

	return nil
}